# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
import json
from qturboframe.lib.utils.thread_local import main_thread_local

from ..common.__script_config__ import script_config
from ..report.log import logger

QturboPythonScriptPathDict = {}
class Variable(object):
    '''
    变量保存

    :Attributes:
     - url: 保存变量的服务器url地址
    '''

    def __init__(self):
        # self.taskgroupid = script_config.task_group_id
        # self.taskid = script_config.task_id
        # self.caseid = script_config.case_id
        self.caseid = main_thread_local.case_id
        self.taskgroupid = main_thread_local.taskgroupid
        self.taskid = main_thread_local.task_id
        self.url = script_config.remote_var_url

    def set_variable(self, var_name, var_value):
        '''
        设置参数值

        :Args:
         - var_name: 参数名
         - var_value: 参数值

        :Example:
         - 例: Variable().set_variable('varc_name','admin')
        '''
        if not var_value:
            var_value = '<nil>'
        try:
            data = dict()
            data['taskGuid'] = self.taskgroupid
            data['taskid'] = self.taskid
            data['caseGuid'] = self.caseid
            data['variableName'] = var_name
            data['variableValue'] = var_value
            # 将字典转化为json字符串
            data = json.dumps(data)
            data = urllib.parse.quote(data)
            data = data.encode(encoding='UTF8')
            headers = {'Content-Type': 'application/json'}
            logger.debug("设置变量的请求URL：{}".format(self.url))
            request = urllib.request.Request(url=self.url, headers=headers)
            response = urllib.request.urlopen(request, data, timeout=3)  # 发送请求
            body = response.read().decode()
            logger.debug('设置参数{}，参数值为{}'.format(var_name, var_value))
        except Exception as msg:
            logger.warn('设置参数失败，' + str(msg))

    def get_variable(self, var_name):
        """
        1. 获取参数值
        1.1 如果参数名称为 "varu_QturboPythonScriptPath"，且当前任务组 ID 存在于全局变量 `QturboPythonScriptPathDict` 中，则直接从字典中获取对应值并返回。
        1.2 如果参数名称不符合上述条件，生成请求 URL，通过网络请求从远程服务获取参数值。
            1.2.1 URL 包含以下查询参数：
                - taskGuid：任务组 ID，需经过 URL 编码。
                - taskid：任务 ID，需经过 URL 编码。
                - caseGuid：用例 ID，需经过 URL 编码。
                - variableName：变量名称，需经过 URL 编码。
            1.2.2 记录请求 URL 到日志中，用于调试。
        1.3 发送 HTTP GET 请求，接收响应并解析响应内容。
            1.3.1 从响应的 JSON 数据中提取 `variableValue` 字段作为参数值。
            1.3.2 如果参数名称为 "varu_QturboPythonScriptPath"，将参数值缓存到全局字典 `QturboPythonScriptPathDict` 中。
            1.3.3 记录获取到的参数名称及对应值到日志中。
        1.4 如果在执行过程中发生异常：
            - 记录警告日志，提示获取参数失败并包含异常信息。
            - 返回 `None` 作为默认值。

        参数说明：
        :param var_name: str, 参数名称，用于指定需要获取的变量。

        返回值：
        :return: str 或 None, 返回获取的参数值；如果发生异常或参数不存在，返回 `None`。

        异常处理：
        - 捕获所有异常并记录警告日志，确保方法执行不会因异常中断。

        示例：
        - Variable().get_variable('var_name')
        """
        try:
            if var_name=="varu_QturboPythonScriptPath" and self.taskgroupid in QturboPythonScriptPathDict:
                return QturboPythonScriptPathDict.get(self.taskgroupid)
            url = '{}?taskGuid={}&taskid={}&caseGuid={}&variableName={}'.format(
                self.url, urllib.parse.quote(self.taskgroupid), urllib.parse.quote(self.taskid),
                urllib.parse.quote(self.caseid), urllib.parse.quote(var_name))
            logger.debug("获取变量的请求URL：{}".format(url))
            request = urllib.request.Request(url=url)
            response = urllib.request.urlopen(request)  # 发送请求
            body = response.read().decode('utf-8')
            var_value = json.loads(body)['variableValue']
            logger.debug('获取参数{}，参数值为{}'.format(var_name, var_value))
            if var_name == "varu_QturboPythonScriptPath":
                QturboPythonScriptPathDict[self.taskgroupid]=var_value
            return var_value
        except Exception as msg:
            logger.warn('获取参数失败，' + str(msg))
            return None

    def set_local_variable(self, var_name, var_value):
        '''
        设置持久化参数值

        :Args:
         - var_name: 参数名
         - var_value: 参数值

        :Example:
         - 例: Variable().set_local_variable('varc_name','admin')
        '''
        if not var_value:
            var_value = '<nil>'
        try:
            data = dict()
            data['taskGuid'] = self.taskgroupid
            data['taskid'] = self.taskid
            data['caseGuid'] = self.caseid
            data['variableName'] = var_name
            data['variableValue'] = var_value
            data['type'] = "local_variable"
            # 将字典转化为json字符串
            data = json.dumps(data)
            data = urllib.parse.quote(data)
            data = data.encode(encoding='UTF8')
            headers = {'Content-Type': 'application/json'}
            url = self.url + "local/"
            logger.debug("设置本地变量的请求URL：{}".format(url))
            request = urllib.request.Request(url=url, headers=headers)
            response = urllib.request.urlopen(request, data, timeout=3)  # 发送请求
            body = response.read().decode()
            logger.debug('设置参数{}，参数值为{}'.format(var_name, var_value))
        except Exception as msg:
            logger.warn('设置参数失败，' + str(msg))

    def get_local_variable(self, var_name):
        '''
        获取参数值

        :Args:
         - var_name: 参数名

        :Returns:
            返回参数值

        :Example:
         - 例: Variable().get_local_variable('varc_name')
        '''
        try:
            local_url = self.url + "local/"
            url = '{}?taskGuid={}&taskid={}&caseGuid={}&variableName={}'.format(
                local_url, urllib.parse.quote(self.taskgroupid), urllib.parse.quote(self.taskid),
                urllib.parse.quote(self.caseid), urllib.parse.quote(var_name))
            logger.debug("获取本地变量的请求URL：{}".format(url))
            request = urllib.request.Request(url=url)
            response = urllib.request.urlopen(request)  # 发送请求
            body = response.read().decode('utf-8')
            var_value = json.loads(body)['variableValue']
            logger.debug('获取参数{}，参数值为{}'.format(var_name, var_value))
            return var_value
        except Exception as msg:
            logger.warn('获取参数失败，' + str(msg))
            return None

    def delete_all_variable(self):
        '''
        获取参数值

        :Args:
         - None

        :Returns:
         - None

        :Example:
         - 例: Variable().get_delete_all_variable()
        '''
        try:
            local_url = self.url + "delete/"
            url = '{}?taskGuid={}&taskid={}&caseGuid={}'.format(
                local_url, urllib.parse.quote(self.taskgroupid), urllib.parse.quote(self.taskid),
                urllib.parse.quote(self.caseid))
            logger.debug("删除全部缓存数据的请求URL：{}".format(url))
            request = urllib.request.Request(url=url)
            response = urllib.request.urlopen(request)  # 发送请求
            # body = response.read().decode('utf-8')
            # var_value = json.loads(body)['variableValue']
            # logger.debug('获取参数{}，参数值为{}'.format(var_name, var_value))
            # return var_value
        except Exception as msg:
            logger.warn('删除本地参数失败，' + str(msg))
            # return None

